/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.mocamorena.persistence;

import br.com.mocamorena.exception.PersistenciaException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Diego
 */
public class GerenciadorDeConexao {

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost/mocamorena";
    private static final String USER = "root";
    private static final String PASSWORD = "";
    private static boolean loaded = false;

    private static void init() throws PersistenciaException {
        try {
            Class.forName(DRIVER);
            loaded = true;
        } catch (ClassNotFoundException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        }
    }

    /**
     * Obtém uma conexão com o banco de dados
     * @return a conexão do banco de dados
     * @throws DukeClubeException
     */
    public static Connection abreConexao() throws PersistenciaException {
        try {
            if (!loaded) {
                init();
            }
            return DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        }
    }

    /**
     * Fecha a conexão com o banco de dados
     * @param con a conexão a ser fechada
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con) throws PersistenciaException {
        fechaConexao(con, null, null);
    }

    /**
     * Fecha a conexão com o banco de dados e o objeto PreparedStatement
     * @param con a conexão a ser fechada
     * @param stmt o objeto PreparedStatement a ser fechado
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con, PreparedStatement stmt) throws
            PersistenciaException {
        fechaConexao(con, stmt, null);
    }

    /**
     * Fecha a conexão com o banco de dados e os objetos PreparedStatement e ResultSet
     * @param con a conexão a ser fechada
     * @param stmt o objeto PreparedStatement a ser fechado
     * @param rs o objeto ResultSet a ser fechado
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con, PreparedStatement stmt, ResultSet rs) throws
            PersistenciaException {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível finalizar a conexão com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        }
    }
}
